// 导入所需的模块和接口
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtPayload } from './interfaces/jwt-payload.interface';
import { UserService } from '../user/user.service';

// 使用@Injectable装饰器标记服务为Nest的注入服务
@Injectable()
// JwtStrategy继承自PassportStrategy，用于实现JWT令牌的验证和用户验证
export class JwtStrategy extends PassportStrategy(Strategy) {
  // 构造函数接收UserService实例
  constructor(private readonly userService: UserService) {
    // 调用父类的构造函数，配置JWT策略
    super({
      // 从请求头中提取JWT作为承载令牌
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      // 不忽略令牌过期的情况
      ignoreExpiration: false,
      // 设置JWT的密钥或密钥路径
      secretOrKey: 'your_secret_key',
    });
  }

  // 验证方法，用于验证JWT的有效性并查找用户
  async validate(payload: JwtPayload) {
    // 根据JWT中的用户ID查找用户
    const user = await this.userService.findOneById(payload.sub);
    // 如果找不到用户，抛出未授权异常
    if (!user) {
      throw new UnauthorizedException();
    }
    // 返回找到的用户
    return user;
  }
}